home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / mus / play / tracker_3_19.lzh / tracker / linux_audio.c < prev    next >
C/C++ Source or Header  |  1993-11-15  |  4KB  |  194 lines

  1. /* linux_audio.c */
  2. /* Modified from soundblaster_audio.c by Hannu Savolainen */
  3. /* hsavolai@cs.helsinki.fi */
  4.  
  5. #include <malloc.h>
  6. #include <stdio.h>
  7. #include <unistd.h>
  8. #include <fcntl.h>
  9. #include "defs.h"
  10. #include "extern.h"
  11.  
  12. /*    This should be sys/soundcard.h    */
  13. #include <sys/soundcard.h>
  14.  
  15. LOCAL char *id = "$Id: linux_audio.c,v 1.5 1993/11/15 17:35:55 espie Exp espie $";
  16.  
  17. LOCAL unsigned char *buffer;/* buffer for ready-to-play samples */
  18. LOCAL short *buffer16;    /* Sure this isn't unsigned short ? */
  19. LOCAL int buf_index;   /* can't call this index, conflicts with index(3) */
  20. LOCAL int buf_max;
  21. LOCAL int audio;            /* /dev/dsp */
  22.  
  23. /* are we playing stereo or not ? */
  24. LOCAL int stereo;
  25. /* 256th of primary/secondary source for that side. */
  26. LOCAL int primary=512, secondary=0;
  27. LOCAL int dsp_samplesize = 16; /* must be 8 or 16 */
  28.  
  29. void set_mix(percent)
  30. int percent;
  31.     {
  32.     percent *= 256;
  33.     percent /= 100;
  34.     primary = percent;
  35.     secondary = 512 - percent;
  36.     }
  37.  
  38. int open_audio(f, s)
  39. int f;
  40. int s;
  41.     {
  42.     audio = open("/dev/dsp", O_WRONLY, 0);
  43.     if (audio == -1)
  44.         {
  45.         perror("Error opening audio device");
  46.         end_all();
  47.         }
  48.  
  49. #ifdef SOUND_VERSION
  50.     /* For the sound driver versions > 1.0 */
  51.     if (ioctl(audio, SNDCTL_DSP_SAMPLESIZE, &dsp_samplesize) 
  52.         == -1)
  53.        dsp_samplesize = 8;    /* Old kernel??? */
  54. #else
  55.     if ((dsp_samplesize=ioctl(audio, SNDCTL_DSP_SAMPLESIZE, dsp_samplesize)) 
  56.         == -1)
  57.        dsp_samplesize = 8
  58. #endif
  59.  
  60.     stereo = s;
  61.  
  62. #ifndef SOUND_VERSION
  63.     if ((stereo=ioctl(audio, SNDCTL_DSP_STEREO, stereo) == -1))
  64.         {
  65.         perror("Error setting stereo/mono");
  66.         end_all();
  67.         }
  68. #else
  69.     if (ioctl(audio, SNDCTL_DSP_STEREO, &stereo) == -1)
  70.         {
  71.         perror("Error setting stereo/mono");
  72.         end_all();
  73.         }
  74. #endif
  75.  
  76.     if (f==0) f = 44100;
  77.  
  78. #ifdef SOUND_VERSION
  79.     if (ioctl(audio, SNDCTL_DSP_SPEED, &f) == -1)
  80.         {
  81.         perror("Error setting frequency");
  82.         end_all();
  83.         }
  84. #else
  85.     if ((f=ioctl(audio, SNDCTL_DSP_SPEED, f)) == -1)
  86.         {
  87.         perror("Error setting frequency");
  88.         end_all();
  89.         }
  90. #endif
  91.  
  92. #ifdef SOUND_VERSION
  93.     if (ioctl (audio, SNDCTL_DSP_GETBLKSIZE, &buf_max) == -1)
  94.         {
  95.           perror("Error getting buffsize");
  96.       end_all();
  97.         }
  98. #else
  99.     if ((buf_max=ioctl (audio, SNDCTL_DSP_GETBLKSIZE, 0)) == -1)
  100.         {
  101.           perror("Error getting buffsize");
  102.       end_all();
  103.         }
  104. #endif
  105.  
  106.     buffer = malloc(buf_max);    /* Stereo makes x2 */
  107.     buffer16 = (short *)buffer;
  108.     buf_index = 0;
  109.  
  110.         return f;
  111.     }
  112.  
  113. LOCAL void actually_flush_buffer()
  114.     {
  115.     int l,i;
  116.  
  117.     l = sizeof(*buffer) * buf_index;
  118.     if (dsp_samplesize !=8) l *= 2;
  119.     write(audio, buffer, l);
  120.  
  121.     buf_index = 0;
  122.     }
  123.  
  124. void output_samples(left, right)
  125. int left, right;
  126.     {
  127.     if (dsp_samplesize != 8)    /* Cool! 16 bits/sample */
  128.     {
  129.         if (stereo)
  130.             {
  131.             if (buf_index * 2 >= buf_max - 1) 
  132.                actually_flush_buffer();
  133.  
  134.             buffer16[buf_index++] = 
  135.                ((left*primary + right*secondary) / 256);
  136.             buffer16[buf_index++] = 
  137.                ((right*primary + left*secondary) / 256);
  138.             }
  139.         else
  140.             {
  141.             if (buf_index * 2 >= buf_max) 
  142.                actually_flush_buffer();
  143.             buffer16[buf_index++] = (left + right);
  144.             }
  145.     }
  146.     else
  147.     {
  148.         if (stereo)
  149.             {
  150.             if (buf_index >= buf_max - 1) 
  151.                 actually_flush_buffer();
  152.             buffer[buf_index++] = ((left*primary + right*secondary) >> 16)
  153.                  + 128;
  154.             buffer[buf_index++] = ((right*primary + left*secondary) >> 16)
  155.                  + 128;
  156.             }
  157.         else
  158.             {
  159.             if (buf_index >= buf_max) 
  160.                 actually_flush_buffer();
  161.             buffer[buf_index++] = ((left + right) >> 8) + 128;
  162.             }
  163.         }
  164.     }
  165.  
  166. void flush_buffer()
  167.     {    /* Dummy version */
  168.     }
  169.  
  170. /*
  171.  * Closing the Linux sound device waits for all pending samples to play.
  172.  */
  173. void close_audio()
  174.     {
  175.     actually_flush_buffer();
  176.     close(audio);
  177.     free(buffer);
  178.     }
  179.  
  180. /* dummy system calls, to patch ? */
  181. void set_synchro(s)
  182.     {
  183.     }
  184.  
  185. int update_frequency()
  186.     {
  187.     return 0;
  188.     }
  189.  
  190. void discard_buffer()
  191.     {
  192.     }
  193.  
  194.